package com.qqtech.oss.aliyun;

import java.io.File;
import java.io.InputStream;

import com.google.common.io.Files;
import com.qqtech.core.common.util.StringUtil;
import com.qqtech.core.common.util.TimeUtil;

/**
 * 文件上传客户端
 * 
 * @author andy.wangzhh
 *
 */
public class FileClient {
	private OSSObject ossObject;

	public FileClient(FileClientConfig config) {
		this.ossObject = new OSSObject(config);
	}

	/**
	 * 生成存储在服务器上的路径
	 *
	 * @param bizzFolder
	 *            需上传到的文件夹名称(通常是业务模块名称的小写)
	 * @param originalFilename
	 *            上传原始文件名
	 * @return 存储路径，类似：/pub/20150522112536_889.PNG
	 */
	public String buildStorePath(String bizzFolder, String originalFilename) {
		StringBuffer storePath = new StringBuffer("/");
		storePath.append(bizzFolder.toLowerCase());
		storePath.append("/");
		storePath.append(TimeUtil.getStringTimeByFormat(TimeUtil.now(), "yyyyMMddhhmmss"));
		storePath.append("_");
		storePath.append(StringUtil.getRandomNum(3));
		storePath.append(".");
		storePath.append(Files.getFileExtension(originalFilename));
		return storePath.toString();
	}

	/**
	 * @param storePath
	 *            文件上传成功后，存储在服务器上的路径,如 /user/a.jpg。
	 *            存储路径根据业务需求进行定义,最好不同的业务存在不同的文件夹下面。 如果服务器上存在同名文件，则存储的文件名会随机生成。如
	 *            /user/a.jpg->/user/1431584210786013.jpg
	 * @param inputStream
	 *            要上传的文件输入流
	 * @param fileSize
	 *            要上传的文件大小(单位:字节byte)
	 * @return
	 * @throws FileClientException
	 */
	public UploadResult putObject(String storePath, InputStream inputStream, long fileSize) throws FileClientException {
		return ossObject.putObject(storePath, inputStream, fileSize);
	}

	/**
	 * @param storePath
	 *            文件上传成功后，存储在服务器上的路径,如 /user/u1/a.jpg。
	 *            存储路径根据业务需求进行定义,最好不同的业务存在不同的文件夹下面。 如果服务器上存在同名文件，则存储的文件名会随机生成。如
	 *            /user/a.jpg->/user/1431584210786013.jpg
	 * @param filePath
	 *            要上传的文件路径
	 * @return
	 * @throws FileClientException
	 */
	public UploadResult putObject(String storePath, String filePath) throws FileClientException {
		return ossObject.putObject(storePath, filePath);
	}

	/**
	 * @param storePath
	 *            文件上传成功后，存储在服务器上的路径,如 /user/a.jpg。
	 *            存储路径根据业务需求进行定义,最好不同的业务存在不同的文件夹下面。 如果服务器上存在同名文件，则存储的文件名会随机生成。如
	 *            /user/a.jpg->/user/1431584210786013.jpg
	 * @param file
	 *            要上传的文件
	 * @return
	 * @throws FileClientException
	 */
	public UploadResult putObject(String storePath, File file) throws FileClientException {
		return ossObject.putObject(storePath, file);
	}
}
